Unit IO32
unit IO32
การใช้งานพอร์ตขนาน บนวินโดวส์ 98 ME และ XP
การใช้งานพอร์ตขนาน บนวินโดวส์ 98 ME และ XP
การใช้งาน
แตกไฟล์ rar ออก ข้างในจะพบไฟล์ IO32.pas, inpout32.dll และ hwinterface.sys
ทำการ Install คอมโพเน้นท์ และกำหนด Search Path ให้ถูกต้อง แล้วทำการสั่ง Compile เป็นอันเสร็จสิ้นกระบวนการติดตั้ง Component
ถ้า คุณใช้ Windows 98 หรือ ME คุณจะสามารถใช้งาน Source Code ได้เลยแต่ถ้าคุณใช้ Windows XP (ไม่เคยทดสอบบน NT) คุณจะต้องทำขั้นตอนต่อไป
ทำการ copy inpout32.dll ไปที่ \windows\system32
พิมพ์ regsvr32 inpout32.dll ลงในหน้าต่าง Start-->Run เป็นการลงทะเบียนไฟล์
ไม่ต้องสนใจ Error ที่แจ้งออกมา และทำการ Restart เครื่องใหม่เป็นอันเสร็จสิ้นกระบวนการติดตั้ง
เราสามารถลบไฟล์ inpout32.dll ทิ้งได้ เพราะไม่มีความจำเป็นต้องใช้ในโปรแกรมของเรา
การทำงาน
ในการทำงานปกติบน Windows 98 หรือ ME เราสามารถ ใช้งานพอร์ตขนานได้โดยผ่าน Assembler คือ
procedure _Out(AddressPort: WORD; Val: Byte);
begin
asm
push dx
mov dx, AddressPort
mov al, Val
out dx, al
pop dx
end;
end;
function _In(AddressPort: WORD): Byte;
begin
asm
push dx
mov dx, AddressPort
in al, dx
mov Result, al
pop dx
end;
end;
แต่ถ้าเป็นบนวินโดวส์ XP เราจะต้องเรียกใช้ผ่้านบริการ Service ซึ่งก็คือ hwinterface นั่นเอง
//ขั้นตอนหลัก ขั้นตอนแรก เป็นการเปิดไดร์เวอร์ hwinterface
hdriver := CreateFile('\?\hwinterface',
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
//หลังจากนั้นจึงจะเขียน หรือ อ่านค่า พอร์ตขนานได้
procedure TPort.PortOut(AddressPort, Val: SmallInt);
var
BytesReturned: DWORD;
Buffer: array[0..3] of Byte;
begin
if (hdriver = 0) then _Out(AddressPort, Val)
else begin
FillChar(Buffer, SizeOf(Buffer), 0);
CopyMemory(@Buffer, @AddressPort, SizeOf(AddressPort));
Buffer[2] := LOBYTE(Val);
DeviceIoControl(hdriver,
DWORD(IOCTL_WRITE_PORT_UCHAR),
@Buffer,
3,
nil,
0,
BytesReturned,
nil);
end;
end;
function TPort.PortIn(AddressPort: WORD): SmallInt;
var
BytesReturned: DWORD;
Buffer: array[0..3] of Byte;
begin
if (hdriver = 0) then Result := _In(AddressPort)
else begin
FillChar(Buffer, SizeOf(Buffer), 0);
CopyMemory(@Buffer, @AddressPort, SizeOf(AddressPort));
DeviceIoControl(hdriver,
DWORD(IOCTL_READ_PORT_UCHAR),
@Buffer,
2,
@Buffer,
1,
BytesReturned,
nil);
Result := Buffer[0];
end;
end;
//และเลิกการใช้งานด้วย
CloseHandle(hdriver);
หมายเหตุ
inpout32.dll เป็น dll ที่พัฒนาขึ้นเพื่อใช้ในการเรียกใช้พอร์ตขนานบน windows XP โดยเฉพาะ ผมจำเวปไซต์ที่เกี่ยวข้องไม่ได้
แต่ผมพัฒนา unit IO32 นี้มาจาก ซอร์สโค้ดของ inpout32.dll ซอร์สโค้ดของ inpout32.dll ซึ่งเขียนขึ้นมาจากภาษา C++ ถ้าต้องการความรู้เพิ่มเติมให้ลอง Search หาดูนะครับ
การนำโปรแกรมที่เขียนขึ้นจาก ซอร์สโค้ดนี้ ไปใช้งาน (EXE) จำเป็นต้องลงทะเบียนไฟล์ทั้งสองก่อนเสมอ ดูตัวอย่างการใช้งานได้ที่โปรแกรม Video Capture และ Telephone Recorder